package com.lazily.innerclass;


/**
 * @Author: GZQ
 * @date: 2025/2/15 23:50
 * @description: 成员内部类的使用
 */

public class MemberInnerClass {

	// 程序入口
	public static void main(String[] args) {
		Outer06 outer06 = new Outer06();
		outer06.t1();

		// 外部其他类, 使用成员内部类的三种方式
		// 方式一
		// outer06.new Inner06(); 相当于把 new Inner06()当做是 outer06 成员
		// 只是一个语法
		Outer06.Innter06 innter06 = outer06.new Innter06();
		innter06.say();

		// 第二方式 在外部类中, 编写一个方法, 可以返回 Inner06对象
		Outer06.Innter06 Innter06Instance = outer06.getInnter06Instance();
		Innter06Instance.say();
		// 第三种方式
		new Outer06().new Innter06();
	}
}

class Outer06 { // 外部类
	private int n1 = 10;
	public String name = "张三";

	private void hi() {
		System.out.println("hi()方法...");
	}

	// 1. 注意：成员内部类, 是定义在外部类的成员位置上
	// 2. 可以添加任意访问修饰符(public、protected、默认、private)、因为它的一个地位就是一个成员
	public class Innter06 { // 成员内部类
		private int n1 = 90;
		private double sal = 99.8;
		public void say() {
			// 在成员内部类中, 可以直接访问外部类的所有成员, 包含私有的
			// 如果成员内部类的成员和外部类的成员重名，会遵守就近原则.
			//，可以通过 外部类名.this.属性 来访问外部类的成员
			System.out.println("Outer06 的 n1 = " + n1 + ", outer06 的 name = " + name + ", 外部类的 n1 = " + Outer06.this.n1);
			hi();
		}
	}
	// 方法，返回一个Inner06实例
	public Innter06 getInnter06Instance() {
		return new Innter06();
	}

	// 写方法
	public void t1() {
		// 使用了成员内部类
		// 创建成员内部类的对象, 然后使用相关的方法
		Innter06 in = new Innter06();
		in.say();
		System.out.println(in.sal);
	}
}
